import logging
import os

import ddddocr
import jsonpath
import requests
from PIL import Image
import base64
from io import BytesIO


def get_auth_captcha():
    """获取验证码的接口"""
    payload = {
        "method": "get",
        "url": os.environ["URL"] + "/auth/captcha"
    }

    response = requests.request(**payload).json()
    sn = jsonpath.jsonpath(response, "$..sn")[0]
    image = jsonpath.jsonpath(response, "$..image")[0]
    return sn, image


def dddd_ocr_text(image):
    # 步骤1，先对image进行分割，得到头部和base64编码的部分
    encode_data = image.split(",")[1]


    # 步骤2，解码base64元数据
    decoded_data = base64.b64decode(encode_data)


    # 步骤3：通过dddocr来识别图片源数据
    ocr = ddddocr.DdddOcr()
    text = ocr.classification(decoded_data)
    return text


sn_captcha_text = {}
run_nums = 0

def get_res_sn_captcha():
    """
    获取验证码及其对应的序列号（sn），并使用OCR技术识别验证码内容。
    
    该函数维护一个全局字典sn_captcha_text来存储最新的验证码信息，
    以及一个全局计数器run_nums来控制验证码的更新频率。
    验证码每两次调用更新一次，或者在sn_captcha_text为空时也会更新。
    
    Returns:
        dict: 包含'sn'和'captcha'键的字典，分别对应验证码的序列号和识别出的文本。
    """
    if os.environ["ENV"] == "prod":
        global run_nums
        # 检查是否需要更新验证码：如果sn_captcha_text为空或者run_nums为偶数时更新
        if not sn_captcha_text or run_nums % 2 == 0:
            # 获取新的验证码图片及sn
            sn, image = get_auth_captcha()
            # 使用OCR识别验证码图片中的文本
            captcha = dddd_ocr_text(image)
            # 更新全局字典
            sn_captcha_text["sn"] = sn
            sn_captcha_text["captcha"] = captcha
        # 每次调用后增加计数器
        run_nums += 1
        # 返回当前存储的验证码信息
        return sn_captcha_text
    elif os.environ["ENV"] == "test":
        # 获取新的验证码图片及sn
        sn, image = get_auth_captcha()
        # 使用OCR识别验证码图片中的文本
        # captcha = dddd_ocr_text(image)
        # 更新全局字典
        sn_captcha_text["sn"] = sn
        sn_captcha_text["captcha"] = "aaaa"  # 是测试环境下固定不变的验证码，请根据实际情况修改
        return sn_captcha_text



